#!/usr/bin/python
# -*-coding:utf-8-*-

# 财务算子中的期数限制(base=2)
cw_low_limit = 2
cw_up_limit = 6

gp_define_func_list = [
    'add',
    'sub',
    'mul',
    'div',
    'sqrt',
    'log',
    'sig',
    'abs',
    'neg',
    'inv',
    'max',
    'min',
    'sin',
    'cos',
    'tan',
]


self_defined_func_dict = {
    # 'max_logical_bool': 2,
    'logical': 4,
    'max_logical': 2,
    'min_logical': 2,
    'lrelu': 1,
    # 'power2': 1,
    # 'power3': 1,
    'protect_abslog': 1,

    ###
    'cs_zscore': 1,
    'cs_rank': 1,
    'cs_minmax': 1,
    'ts_delay': 2,
    'ts_corr': 3,
    'ts_min': 2,
    'ts_max': 2,
    'ts_kurt': 2,
    'ts_skew': 2,
    'ts_std': 2,
    'ts_sum': 2,
    'ts_norm': 2,
    'ts_minmax': 2,
    'cs_cap_neu_rank': 1,
    'cs_cap_neu_norm': 1,
    'cs_cap_neu_demean': 1,
    'cs_ci1_neu_rank': 1,
    'cs_ci1_neu_norm': 1,
    'cs_ci1_neu_demean': 1,

    ###
    'ts_ma': 2,
    'ts_roc': 2,
    'ts_bias': 2,
    'ts_ema': 2,
    'ts_rsi': 2,
    'ts_trix': 2,
    'ts_kama': 2,
    'ts_ls': 2,
    'ts_ls_slope': 2,
    'ts_ls_angle': 2,
    'ts_ls_intercept': 2,

    # new added - cw ts
    'cw_delay_qoq': 1,
    'cw_change_rate_qoq': 1,
    'cw_delta_qoq': 1,

    'ts_cw_delay': 2,
    'ts_cw_corr': 3,
    'ts_cw_min': 2,
    'ts_cw_max': 2,
    'ts_cw_std': 2,
    'ts_cw_sum': 2,
    'ts_cw_norm': 2,
    'ts_cw_ols_residual': 3,
    'ts_cw_ols_rsq': 3,
    'ts_cw_ols_beta': 3,
    'ts_cw_ols_const': 3,
    'ts_cw_ma': 2,
    'ts_cw_change_rate': 2,
    'ts_cw_delta': 2,
    'ts_cw_bias': 2,
    'ts_cw_ls': 2,
    'ts_cw_ls_slope': 2,
    'ts_cw_ls_angle': 2,
    'ts_cw_ls_intercept': 2,
}

self_defined_seq_func_dict = {
    # 'max_logical_bool': 2,
    'logical': 4,
    'max_logical': 2,
    'min_logical': 2,
    'lrelu': 1,
    # 'power2': 1,
    # 'power3': 1,
    'protect_abslog': 1,

    ##
    'cs_zscore': 1,
    'cs_rank': 1,
    # 'cs_minmax': 1,
    'cs_cap_neu_rank': 1,
    # 'cs_cap_neu_norm': 1,
    'cs_cap_neu_demean': 1,
    'cs_ci1_neu_rank': 1,
    # 'cs_ci1_neu_norm': 1,
    'cs_ci1_neu_demean': 1,

    ##
    'ts_delay': 2,
    'ts_corr': 3,
    'ts_min': 2,
    'ts_max': 2,
    'ts_kurt': 2,
    'ts_skew': 2,
    'ts_std': 2,
    'ts_sum': 2,
    'ts_norm': 2,
    'ts_minmax': 2,

    'ts_ma': 2,
    'ts_roc': 2,
    'ts_bias': 2,
    'ts_ema': 2,
    'ts_rsi': 2,
    'ts_trix': 2,
    'ts_kama': 2,
    'ts_ls': 2,
    'ts_ls_slope': 2,
    'ts_ls_angle': 2,
    'ts_ls_intercept': 2,
}

self_defined_cw_used_func_dict = {
    'logical': 4,
    'max_logical': 2,
    'min_logical': 2,
    'lrelu': 1,
    'protect_abslog': 1,

    ###
    'cs_zscore': 1,
    'cs_rank': 1,
    # 'cs_minmax': 1,
    'cs_cap_neu_rank': 1,
    # 'cs_cap_neu_norm': 1,
    'cs_cap_neu_demean': 1,
    'cs_ci1_neu_rank': 1,
    # 'cs_ci1_neu_norm': 1,
    'cs_ci1_neu_demean': 1,

    # new added - cw ts
    'cw_delay_qoq': 1,
    'cw_change_rate_qoq': 1,
    'cw_delta_qoq': 1,

    'ts_cw_delay': 2,
    'ts_cw_corr': 3,
    'ts_cw_min': 2,
    'ts_cw_max': 2,
    'ts_cw_std': 2,
    'ts_cw_sum': 2,
    'ts_cw_norm': 2,
    'ts_cw_ols_residual': 3,
    'ts_cw_ols_rsq': 3,
    'ts_cw_ols_beta': 3,
    'ts_cw_ols_const': 3,
    'ts_cw_ma': 2,
    'ts_cw_change_rate': 2,
    'ts_cw_delta': 2,
    'ts_cw_bias': 2,
    'ts_cw_ls': 2,
    'ts_cw_ls_slope': 2,
    'ts_cw_ls_angle': 2,
    'ts_cw_ls_intercept': 2,
}


if __name__ == '__main__':
    from gplearn_evolve.base.GPFunctionsCWV1 import *
    from gplearn_evolve.base.GPFunctionsCWV2 import *

    cehck_cw_gp_func_list = {
        # new added - cw ts
        'cw_delay_qoq': 1,
        'cw_change_rate_qoq': 1,
        'cw_delta_qoq': 1,

        'ts_cw_delay': 2,
        'ts_cw_corr': 3,
        'ts_cw_min': 2,
        'ts_cw_max': 2,
        'ts_cw_std': 2,
        'ts_cw_sum': 2,
        'ts_cw_norm': 2,
        'ts_cw_ols_residual': 3,
        'ts_cw_ols_rsq': 3,
        'ts_cw_ols_beta': 3,
        'ts_cw_ols_const': 3,
        'ts_cw_ma': 2,
        'ts_cw_change_rate': 2,
        'ts_cw_delta': 2,
        'ts_cw_bias': 2,
        'ts_cw_ls': 2,
        'ts_cw_ls_slope': 2,
        'ts_cw_ls_angle': 2,
        'ts_cw_ls_intercept': 2,
    }

    keys = None
    key_by_path = False
    for gp_name in cehck_cw_gp_func_list.keys():
        try:
            func = eval('def_keyfunc_' + gp_name)(keys, key_by_path=key_by_path)
            print(gp_name, 'exists...')
        except:
            print(gp_name, 'does not exist...')
